home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 February / EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso / earcd / assembler / progasm1.lha / SORGENTI2 / LEZIONE5d.s < prev    next >
Text File  |  1994-10-30  |  7KB  |  215 lines

  1.  
  2. ; Lezione5d.s    SCORRIMENTO DI UNA FIGURA IN ALTO E IN BASSO MODIFICANDO I
  3. ;        PUNTATORI AI PITPLANES NELLA COPPERLIST PIU' SCORRIMENTO
  4. ;        A DESTRA E SINISTRA TRAMITE IL $dff102 (BPLCON0)
  5.  
  6.     SECTION    CiriCop,CODE
  7.  
  8. Inizio:
  9.     move.l    4.w,a6        ; Execbase in a6
  10.     jsr    -$78(a6)    ; Disable - ferma il multitasking
  11.     lea    GfxName(PC),a1    ; Indirizzo del nome della lib da aprire in a1
  12.     jsr    -$198(a6)    ; OpenLibrary
  13.     move.l    d0,GfxBase    ; salvo l'indirizzo base GFX in GfxBase
  14.     move.l    d0,a6
  15.     move.l    $26(a6),OldCop    ; salviamo l'indirizzo della copperlist vecchia
  16.  
  17. ;     PUNTIAMO I NOSTRI BITPLANES
  18.  
  19.     MOVE.L    #PIC,d0        ; in d0 mettiamo l'indirizzo della PIC,
  20.     LEA    BPLPOINTERS,A1    ; puntatori nella COPPERLIST
  21.     MOVEQ    #2,D1        ; numero di bitplanes -1 (qua sono 3)
  22. POINTBP:
  23.     move.w    d0,6(a1)    ; copia la word BASSA dell'indirizzo del plane
  24.     swap    d0        ; scambia le 2 word di d0 (es: 1234 > 3412)
  25.     move.w    d0,2(a1)    ; copia la word ALTA dell'indirizzo del plane
  26.     swap    d0        ; scambia le 2 word di d0 (es: 3412 > 1234)
  27.     ADD.L    #40*256,d0    ; + lunghezza bitplane -> prossimo bitplane
  28.     addq.w    #8,a1        ; andiamo ai prossimi bplpointers nella COP
  29.     dbra    d1,POINTBP    ; Rifai D1 volte POINTBP (D1=num of bitplanes)
  30.  
  31.     move.l    #COPPERLIST,$dff080    ; Puntiamo la nostra COP
  32.     move.w    d0,$dff088        ; Facciamo partire la COP
  33.  
  34.     move.w    #0,$dff1fc        ; Disattiva l'AGA
  35.     move.w    #$c00,$dff106        ; Disattiva l'AGA
  36.  
  37. mouse:
  38.     cmpi.b    #$ff,$dff006    ; Siamo alla linea 255?
  39.     bne.s    mouse        ; Se non ancora, non andare avanti
  40.  
  41.  
  42.     bsr.w    MuoviCopper    ; fa scorrere la figura in alto e in basso
  43.                 ; di una linea alla volta cambiando i
  44.                 ; puntatori ai bitplanes in copperlist
  45.  
  46.     btst    #2,$dff016    ; se il tasto destro e' premuto salta
  47.     beq.s    Aspetta        ; la routine dello scroll, bloccandolo
  48.  
  49.     bsr.w    MuoviCopper2    ; fa scorrere col $dff102 la figura a destra
  50.                 ; e a sinistra (massimo 15 pixel)
  51.  
  52. Aspetta:
  53.     cmpi.b    #$ff,$dff006    ; Siamo alla linea 255?
  54.     beq.s    Aspetta        ; Se si, non andare avanti, aspetta!
  55.  
  56.     btst    #6,$bfe001    ; tasto sinistro del mouse premuto?
  57.     bne.s    mouse        ; se no, torna a mouse:
  58.  
  59.     move.l    OldCop(PC),$dff080    ; Puntiamo la cop di sistema
  60.     move.w    d0,$dff088        ; facciamo partire la vecchia cop
  61.  
  62.     move.l    4.w,a6
  63.     jsr    -$7e(a6)    ; Enable - riabilita il Multitasking
  64.     move.l    gfxbase(PC),a1    ; Base della libreria da chiudere
  65.     jsr    -$19e(a6)    ; Closelibrary - chiudo la graphics lib
  66.     rts            ; USCITA DAL PROGRAMMA
  67.  
  68. ;    Dati
  69.  
  70. GfxName:
  71.     dc.b    "graphics.library",0,0    
  72.  
  73. GfxBase:        ; Qua ci va l'indirizzo di base per gli Offset
  74.     dc.l    0    ; della graphics.library
  75.  
  76. OldCop:            ; Qua ci va l'indirizzo della vecchia COP di sistema
  77.     dc.l    0
  78.  
  79.  
  80. ;    Questa routine sposta la figura in alto e in basso, agendo sui
  81. ;    puntatori ai bitplanes in copperlist (tramite la label BPLPOINTERS)
  82. ;    La struttura e' simile a quella di Lezione3d.s
  83.  
  84. MuoviCopper:
  85.     LEA    BPLPOINTERS,A1    ; Con queste 4 istruzioni preleviamo dalla
  86.     move.w    2(a1),d0    ; copperlist l'indirizzo dove sta puntando
  87.     swap    d0        ; attualmente il $dff0e0 e lo poniamo
  88.     move.w    6(a1),d0    ; in d0
  89.     TST.B    SuGiu        ; Dobbiamo salire o scendere?
  90.     beq.w    VAIGIU
  91.     cmp.l    #PIC-(40*30),d0    ; siamo arrivati abbastanza in ALTO?
  92.     beq.s    MettiGiu    ; se si, siamo in cima e dobbiamo scendere
  93.     sub.l    #40,d0        ; sottraiamo 40, ossia 1 linea
  94.     bra.s    Finito
  95.  
  96. MettiGiu:
  97.     clr.b    SuGiu        ; Azzerando SuGiu, al TST.B SuGiu il BEQ
  98.     bra.s    Finito        ; fara' saltare alla routine VAIGIU
  99.  
  100. VAIGIU:
  101.     cmpi.l    #PIC+(40*30),d0    ; siamo arrivati abbastanza in BASSO?
  102.     beq.s    MettiSu        ; se si, siamo in fondo e dobbiamo risalire
  103.     add.l    #40,d0        ; Aggiungiamo 40, ossia 1 linea
  104.     bra.s    finito
  105.  
  106. MettiSu:
  107.     move.b    #$ff,SuGiu    ; Quando la label SuGiu non e' a zero,
  108.     rts            ; significa che dobbiamo risalire.
  109.  
  110. Finito:                ; PUNTIAMO I PUNTATORI BITPLANES
  111.     LEA    BPLPOINTERS,A1    ; puntatori nella COPPERLIST
  112.     MOVEQ    #2,D1        ; numero di bitplanes -1 (qua sono 3)
  113. POINTBP2:
  114.     move.w    d0,6(a1)    ; copia la word BASSA dell'indirizzo del plane
  115.     swap    d0        ; scambia le 2 word di d0 (es: 1234 > 3412)
  116.     move.w    d0,2(a1)    ; copia la word ALTA dell'indirizzo del plane
  117.     swap    d0        ; scambia le 2 word di d0 (es: 3412 > 1234)
  118.     ADD.L    #40*256,d0    ; + lunghezza bitplane -> prossimo bitplane
  119.     addq.w    #8,a1        ; andiamo ai prossimi bplpointers nella COP
  120.     dbra    d1,POINTBP2    ; Rifai D1 volte POINTBP (D1=num of bitplanes)
  121.     rts
  122.  
  123. ;    Questo byte, indicato dalla label SuGiu, e' un FLAG.
  124.  
  125. SuGiu:
  126.     dc.b    0,0
  127.  
  128. ;***************************************************************************
  129. MuoviCopper2:
  130.     TST.B    FLAG        ; Dobbiamo avanzare o indietreggiare?
  131.     beq.w    AVANTI
  132.     cmpi.b    #$00,MIOCON1    ; siamo arrivati alla posizione normale?
  133.     beq.s    MettiAvanti    ; se si, dobbiamo avanzare!
  134.     sub.b    #$11,MIOCON1    ; sottraiamo 1 allo scroll dei bitplanes
  135.     rts
  136.  
  137. MettiAvanti:
  138.     clr.b    FLAG        ; Azzerando FLAG, al TST.B FLAG il BEQ
  139.     rts            ; fara' saltare alla routine AVANTI
  140.  
  141. AVANTI:
  142.     cmpi.b    #$ff,MIOCON1    ; siamo arrivati allo scroll massimo in
  143.                 ; avanti, ossia $FF? ($f pari e $f dispari)
  144.     beq.s    MettiIndietro    ; se si, siamo dobbiamo tornare indietro
  145.     add.b    #$11,MIOCON1    ; aggiungiamo 1 allo scroll dei bitplanes
  146.     rts
  147.  
  148. MettiIndietro:
  149.     move.b    #$ff,FLAG    ; Quando la label FLAG non e' a zero,
  150.     rts            ; significa che dobbiamo indietreggiare
  151.  
  152. ;    Questo byte e' un FLAG, ossia serve per indicare se andare avanti o
  153. ;    indietro.
  154.  
  155. FLAG:
  156.     dc.b    0,0
  157.  
  158.  
  159.     SECTION    GRAPHIC,DATA_C
  160.  
  161. COPPERLIST:
  162.     dc.w    $120,$0000,$122,$0000,$124,$0000,$126,$0000,$128,$0000 ; SPRITE
  163.     dc.w    $12a,$0000,$12c,$0000,$12e,$0000,$130,$0000,$132,$0000
  164.     dc.w    $134,$0000,$136,$0000,$138,$0000,$13a,$0000,$13c,$0000
  165.     dc.w    $13e,$0000
  166.  
  167.     dc.w    $8e,$2c81    ; DiwStrt    (registri con valori normali)
  168.     dc.w    $90,$2cc1    ; DiwStop
  169.     dc.w    $92,$0038    ; DdfStart
  170.     dc.w    $94,$00d0    ; DdfStop
  171.  
  172.     dc.w    $102        ; BplCon1 - IL REGISTRO
  173.     dc.b    $00        ; BplCon1 - IL BYTE NON UTILIZZATO!!!
  174. MIOCON1:
  175.     dc.b    $00        ; BplCon1 - IL BYTE UTILIZZATO!!!
  176.  
  177.     dc.w    $104,0        ; BplCon2
  178.     dc.w    $108,0        ; Bpl1Mod
  179.     dc.w    $10a,0        ; Bpl2Mod
  180.  
  181.             ; 5432109876543210    ; BPLCON0:
  182.     dc.w    $100,%0011001000000000    ; bits 13 e 12 accesi!! (3 = %011)
  183.                     ; 3 bitplanes lowres, non lace
  184. BPLPOINTERS:
  185.     dc.w $e0,$0000,$e2,$0000    ;primo     bitplane - BPL0PT
  186.     dc.w $e4,$0000,$e6,$0000    ;secondo bitplane - BPL1PT
  187.     dc.w $e8,$0000,$ea,$0000    ;terzo     bitplane - BPL2PT
  188.  
  189.     dc.w    $0180,$000    ; color0
  190.     dc.w    $0182,$475    ; color1
  191.     dc.w    $0184,$fff    ; color2
  192.     dc.w    $0186,$ccc    ; color3
  193.     dc.w    $0188,$999    ; color4
  194.     dc.w    $018a,$232    ; color5
  195.     dc.w    $018c,$777    ; color6
  196.     dc.w    $018e,$444    ; color7
  197.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  198.  
  199. ;    figura
  200.  
  201.     dcb.b    40*30,0            ; spazio azzerato
  202.  
  203. PIC:
  204.     incbin    "amiga.320*256*3"    ; qua carichiamo la figura in RAW,
  205.                     ; convertita col KEFCON, fatta di
  206.                     ; 3 bitplanes consecutivi
  207.  
  208.     dcb.b    40*30,0            ; spazio azzerato
  209.  
  210.     end
  211.  
  212. Nulla di nuovo, semplicemente sono stati uniti i sorgenti precedenti della
  213. Lezione5.s
  214.  
  215.